var _ = require('underscore'),
    op = require('../utils/operand');
/**
 * 主题信息topic和过滤条件filter匹配逻辑
 * @private
 * @param {Object} topic 主题信息
 * @param {Object} filter 过滤条件对象，包括各种过滤条件
 * @result {Boolean} 返回true，如果匹配成功
 */
function doMatch(topic, filter) {
    //这里是遍历filter里面的属性，所以如果filter里面不包含某个属性，也会认为topic匹配该filter
    var meta = topic.meta;
    for(var property in filter) {
        if( typeof filter[property] === 'string' || typeof filter[property] === 'number') {
            if(meta[property] != filter.property) {
                return false;
            }
        } else if( typeof filter[property] === 'array') {
            var values = filter[property];
            var matched = false;
            for(var i in values) {
                var value = values[i];
                //{value: 'your value', op: '> or < or else'}
                if( typeof value === 'object' && value.hasOwnProperty('value') && value.hasOwnProperty('op')) {
                    var opfunc = op[value['op']]
                    if(opfunc && opfunc(value, meta[property])) {  //验证是否满足条件，满足条件返回true
                        matched = true;
                        break;
                    }
                }
            }
            if(!matched) {
                return false;
            }
        }
    }
    return true;
}

/**
 * 判断topic是否满足filter要求。如果是则返回true，否则返回false
 *
 * @param {Object} topic 需要匹配的主题信息，不能为空
 * @filter {String/Object} filter 过滤条件对象，包含各种过滤条件，如果是String需要是能够转成JSON对象，
 * 不能为空。
 * @result {Boolean} true 如果topic满足filter条件
 */
exports.match = function(topic, filter){
    if(!filter || !topic || !topic.meta){
        return false;
    }

    if(_.isString(filter)){
        try{
            filter = JSON.parse(filter);
        }catch(err){
            console.log('conver filter from string to json object failed: ' + filter);
            console.log(err);
            filter = null;
        }
    }

    if (!filter) {
        return false;
    }

    return doMatch(topic, filter);
}